import React from "react";
import {IWeapon, IWeaponPiercing} from "../types/IUnit";
import {
    Accordion,
    AccordionDetails,
    AccordionSummary,
    Grid2,
    Paper,
    styled,
    Table,
    TableBody,
    TableCell,
    tableCellClasses,
    TableContainer,
    TableHead,
    TableRow, ToggleButton, ToggleButtonGroup
} from "@mui/material";
import ArmorType from "./ArmorType";
import ArmorTypeNames from "../types/ArmorTypeValues";
import {IconUrl} from "../core/api";
import {ExpandMore} from "@mui/icons-material";
import Sergeant from "./Sergeant";
import {IMod} from "../types/Imod";
import {Irace} from "../types/Irace";
import {renderAffectedResearches} from "./building/Research";
import Required from "./Required";

interface IWeaponProps {
    weapon: IWeapon,
    isDefault: Boolean,
    renderRequired: Boolean,
    mod: IMod,
    race: Irace,
    haveReinforceMenu: Boolean,
}

class Weapon extends React.Component<IWeaponProps, any> {

    public static defaultProps = {
        isDefault: false,
        renderRequired: true,
    };

    humanReadableName(unit: string) {
        const firstUpper = String(unit).charAt(0).toUpperCase() + String(unit).slice(1);
        return firstUpper.replaceAll('_', ' ').replace('.rgd', '');
    }

    constructor(props: any) {
        super(props);
        this.state = ({
            currentTable: 'dps'
        });
    }


    getPiercingK(armorType: string): number {
        const weaponPiercing = this.props.weapon.weaponArmorPiercing.find((p) => p.armorType.name === armorType)
        return (typeof weaponPiercing !== "undefined" ? weaponPiercing.piercingValue : 10) / 100
    }

    handleChange = (e: React.MouseEvent, selectedDamageTable: String | null) => {
        this.setState({
            currentTable: selectedDamageTable
        });
    }


    render() {

        const weapon = this.props.weapon


        const dpsK = (this.state.currentTable == "dps") ? weapon.accuracy * (1 / (weapon.reloadTime - (weapon.reloadTime % 0.125))) : 1

        const infLowPiercing = this.getPiercingK(ArmorTypeNames.InfantryLow)
        const infMedPiercing = this.getPiercingK(ArmorTypeNames.InfantryMedium)
        const infHighPiercing = this.getPiercingK(ArmorTypeNames.InfantryHigh)
        const infHeavyMedPiercing = this.getPiercingK(ArmorTypeNames.InfantryHeavyMedium)
        const infHeavyHighPiercing = this.getPiercingK(ArmorTypeNames.InfantryHeavyHigh)
        const demonPiercing = this.getPiercingK(ArmorTypeNames.DemonMedium)
        const demonHighPiercing = this.getPiercingK(ArmorTypeNames.DemonHigh)
        const commanderPiercing = this.getPiercingK(ArmorTypeNames.Commander)

        const airPiercing = this.getPiercingK(ArmorTypeNames.Air)
        const vehLowPiercing = this.getPiercingK(ArmorTypeNames.VehicleLow)
        const vehMedPiercing = this.getPiercingK(ArmorTypeNames.VehicleMedium)
        const vehHighPiercing = this.getPiercingK(ArmorTypeNames.VehicleHigh)
        const buildingLowPiercing = this.getPiercingK(ArmorTypeNames.BuildingLow)
        const buildingMedPiercing = this.getPiercingK(ArmorTypeNames.BuildingMedium)
        const buildingHighPiercing = this.getPiercingK(ArmorTypeNames.BuildingHigh)

        // UA mod
        const demonLowPiercing = this.getPiercingK(ArmorTypeNames.DemonLow)
        const buildingSuperPiercing = this.getPiercingK(ArmorTypeNames.BuildingSuper)
        const livingMetalPiercing = this.getPiercingK(ArmorTypeNames.LivingMetal)
        const titanPiercing = this.getPiercingK(ArmorTypeNames.Titan)

        const getTotalDamage = (damagePiercing: number, isAir: boolean = false) => {

            if (!isAir && !weapon.canAttackGround && !weapon.isMeleeWeapon) return ""
            if (isAir && !weapon.canAttackAir) return ""

            var minDamage = damagePiercing * weapon.minDamage
            var maxDamage = damagePiercing * weapon.maxDamage

            if (minDamage < weapon.minDamageValue) {
                minDamage = weapon.minDamageValue
            }
            if (maxDamage < weapon.minDamageValue) {
                maxDamage = weapon.minDamageValue
            }

            const averageDmg = (minDamage + maxDamage) / 2

            return (averageDmg * dpsK).toFixed(2)
        }

        const getMoraleDamage = () => {
            return (weapon.moraleDamage * dpsK / 2).toFixed(2)
        }


        const StyledTableCell = styled(TableCell)(({theme}) => ({
            [`&.${tableCellClasses.head}`]: {
                backgroundColor: "rgb(244,244,244)",
                marginRight: 'auto',
                marginLeft: 'auto',
                paddingLeft: 10
            },
            [`&.${tableCellClasses.body}`]: {
                fontSize: 12,
                textAlign: 'center',
                paddingRight: 18,
                paddingLeft: 10
            },
        }));

        return (
            <div style={{marginBottom: 10}}><Accordion>
                <AccordionSummary
                    expandIcon={<ExpandMore/>}
                    aria-controls="panel1-content"
                    id="panel1-header"
                >
                    <span style={{fontSize: 18}}> {!this.props.isDefault && weapon.icon && !weapon.icon.endsWith("upgrade.png") ?
                        <img className="weaponIcon" src={IconUrl + weapon.icon.replaceAll('\\', '/')}/> : (
                            weapon.isMeleeWeapon ?
                                <img className="weaponIcon" src="/images/MeleeStance_icon_bw.jpg"/> :
                                <img className="weaponIcon" src="/images/RangedStance_icon_bw.jpg"/>
                        )} {weapon.name ? weapon.name : this.humanReadableName(weapon.filename)} </span>
                </AccordionSummary>
                <AccordionDetails>
                    <Grid2 container spacing={2}>
                        <Grid2 size={12}>
                            <div style={{whiteSpace: "pre-wrap"}}>
                            <span
                                className="weaponDescription">{this.props.isDefault ? "Default weapon" : weapon.description}</span>
                            </div>
                        </Grid2>

                        <Grid2 size={{xs: 12, md: 4}}>
                            <TableContainer component={Paper}>
                                <Table size="small" aria-label="a dense table">
                                    {/*<TableHead><TableRow><TableCell component="th" scope="row"><b>Damage</b></TableCell><TableCell/></TableRow></TableHead>*/}
                                    <TableBody>
                                        <TableRow
                                            sx={{'&:last-child td, &:last-child th': {border: 0}}}
                                        >
                                            <TableCell component="th" scope="row">Base damage</TableCell>
                                            <TableCell component="th"
                                                       scope="row">{weapon.minDamage} {weapon.maxDamage !== weapon.minDamage && "- " + weapon.maxDamage}
                                            </TableCell>
                                        </TableRow>
                                        <TableRow
                                            sx={{'&:last-child td, &:last-child th': {border: 0}}}
                                        >
                                            <TableCell component="th" scope="row">Accuracy</TableCell>
                                            <TableCell component="th"
                                                       scope="row">{weapon.accuracy.toFixed(3).replace(/[,.]?0+$/, '')}
                                            </TableCell>
                                        </TableRow>
                                        <TableRow
                                            sx={{'&:last-child td, &:last-child th': {border: 0}}}
                                        >
                                            <TableCell component="th" scope="row">Accuracy moving</TableCell>
                                            <TableCell component="th"
                                                       scope="row">{weapon.setupTime === 0 && weapon.accuracy - weapon.accuracyReductionMoving > 0 ? (weapon.accuracy - weapon.accuracyReductionMoving).toFixed(3).replace(/[,.]?0+$/, '') : "-"}
                                            </TableCell>
                                        </TableRow>

                                    </TableBody>
                                </Table>
                            </TableContainer>
                        </Grid2>
                        <Grid2 size={{xs: 12, md: 4}}>
                            <TableContainer component={Paper}>
                                <Table size="small" aria-label="a dense table">
                                    <TableBody>
                                        <TableRow
                                            sx={{'&:last-child td, &:last-child th': {border: 0}}}
                                        >
                                            <TableCell component="th" scope="row">Reload time</TableCell>
                                            <TableCell component="th"
                                                       scope="row">{weapon.reloadTime}
                                            </TableCell>
                                        </TableRow>
                                        <TableRow
                                            sx={{'&:last-child td, &:last-child th': {border: 0}}}
                                        >
                                            <TableCell component="th" scope="row">Range</TableCell>
                                            <TableCell component="th"
                                                       scope="row">{weapon.maxRange ? (weapon.maxRange) : "-"} {weapon.minRange ? "(min " + (weapon.minRange) + ")" : ""}
                                            </TableCell>
                                        </TableRow>
                                        <TableRow
                                            sx={{'&:last-child td, &:last-child th': {border: 0}}}
                                        >
                                            <TableCell component="th" scope="row">Damage radius</TableCell>
                                            <TableCell component="th"
                                                       scope="row">{weapon.damageRadius ? (weapon.damageRadius) : "-"}
                                            </TableCell>
                                        </TableRow>

                                    </TableBody>
                                </Table>
                            </TableContainer>
                        </Grid2>
                        <Grid2 size={{xs: 12, md: 4}}>
                            <TableContainer component={Paper}>
                                <Table size="small" aria-label="a dense table">
                                    <TableBody>
                                        <TableRow
                                            sx={{'&:last-child td, &:last-child th': {border: 0}}}
                                        >
                                            <TableCell component="th" scope="row">Cost</TableCell>
                                            {(weapon.costRequisition > 0 || weapon.costPower > 0) ?
                                                <TableCell component="th"
                                                           scope="row">
                                                    {weapon.costRequisition > 0 &&
                                                        <span>&nbsp;<img style={{verticalAlign: "top"}}
                                                                         src="/images/Resource_requisition.gif"/>&nbsp;
                                                            {weapon.costRequisition.toFixed(0)}</span>}
                                                    {weapon.costPower > 0 &&
                                                        <span>&nbsp;<img style={{verticalAlign: "top"}}
                                                                         src="/images/Resource_power.gif"/>&nbsp;
                                                            {weapon.costPower.toFixed(0)}</span>}
                                                </TableCell> : <TableCell component="th" scope="row"> - </TableCell>
                                            }
                                        </TableRow>
                                        <TableRow
                                            sx={{'&:last-child td, &:last-child th': {border: 0}}}
                                        >
                                            <TableCell component="th" scope="row">Setup time</TableCell>
                                            <TableCell component="th"
                                                       scope="row">{weapon.setupTime != 0 ? (weapon.setupTime).toFixed(3).replace(/[,.]?0+$/, '') : "-"}
                                            </TableCell>
                                        </TableRow>
                                        <TableRow
                                            sx={{'&:last-child td, &:last-child th': {border: 0}}}
                                        >
                                            <TableCell component="th" scope="row">Throw force</TableCell>
                                            <TableCell component="th"
                                                       scope="row">{weapon.throwForceMin != 0 ? weapon.throwForceMin + " - " + weapon.throwForceMax : "-"}
                                            </TableCell>
                                        </TableRow>
                                    </TableBody>
                                </Table>
                            </TableContainer>
                        </Grid2>

                        <Grid2 size={12}>
                            <ToggleButtonGroup
                                color="primary"
                                exclusive
                                value={this.state.currentTable}
                                onChange={this.handleChange}
                                aria-label="Platform"
                            >
                                <ToggleButton size="small" value="dps">Dps</ToggleButton>
                                <ToggleButton size="small" value="one hit">One hit average damage</ToggleButton>
                            </ToggleButtonGroup>
                            <TableContainer>
                                { this.props.mod !== undefined && this.props.mod.name.includes("Ultimate Apocalypse") ?
                                    <Table sx={{marginTop: "10px", textAlign: "center"}} size="small" aria-label="a dense table">
                                        <TableHead>
                                            <TableRow>
                                                <StyledTableCell><ArmorType
                                                    name={ArmorTypeNames.InfantryLow}/></StyledTableCell>
                                                <StyledTableCell><ArmorType
                                                    name={ArmorTypeNames.InfantryMedium}/></StyledTableCell>
                                                <StyledTableCell><ArmorType
                                                    name={ArmorTypeNames.InfantryHigh}/></StyledTableCell>
                                                <StyledTableCell><ArmorType
                                                    name={ArmorTypeNames.InfantryHeavyMedium}/></StyledTableCell>
                                                <StyledTableCell><ArmorType
                                                    name={ArmorTypeNames.InfantryHeavyHigh}/></StyledTableCell>
                                                <StyledTableCell><ArmorType
                                                    name={ArmorTypeNames.Commander}/></StyledTableCell>
                                                <StyledTableCell><ArmorType
                                                    name={ArmorTypeNames.DemonLow}/></StyledTableCell>
                                                <StyledTableCell><ArmorType
                                                    name={ArmorTypeNames.DemonMedium}/></StyledTableCell>
                                                <StyledTableCell><ArmorType
                                                    name={ArmorTypeNames.DemonHigh}/></StyledTableCell>
                                                <StyledTableCell><ArmorType name={ArmorTypeNames.Air}/></StyledTableCell>
                                            </TableRow>
                                        </TableHead>
                                        <TableBody>
                                            <TableRow>
                                                <StyledTableCell>{getTotalDamage(infLowPiercing)}</StyledTableCell>
                                                <StyledTableCell>{getTotalDamage(infMedPiercing)}</StyledTableCell>
                                                <StyledTableCell>{getTotalDamage(infHighPiercing)}</StyledTableCell>
                                                <StyledTableCell>{getTotalDamage(infHeavyMedPiercing)}</StyledTableCell>
                                                <StyledTableCell>{getTotalDamage(infHeavyHighPiercing)}</StyledTableCell>
                                                <StyledTableCell>{getTotalDamage(commanderPiercing)}</StyledTableCell>
                                                <StyledTableCell>{getTotalDamage(demonLowPiercing)}</StyledTableCell>
                                                <StyledTableCell>{getTotalDamage(demonPiercing)}</StyledTableCell>
                                                <StyledTableCell>{getTotalDamage(demonHighPiercing)}</StyledTableCell>
                                                <StyledTableCell>{getTotalDamage(airPiercing, true)}</StyledTableCell>
                                            </TableRow>
                                        </TableBody>
                                        <TableHead>
                                            <TableRow>
                                                <StyledTableCell><ArmorType
                                                    name={ArmorTypeNames.VehicleLow}/></StyledTableCell>
                                                <StyledTableCell><ArmorType
                                                    name={ArmorTypeNames.VehicleMedium}/></StyledTableCell>
                                                <StyledTableCell><ArmorType
                                                    name={ArmorTypeNames.VehicleHigh}/></StyledTableCell>
                                                <StyledTableCell><ArmorType
                                                    name={ArmorTypeNames.LivingMetal}/></StyledTableCell>
                                                <StyledTableCell><ArmorType
                                                    name={ArmorTypeNames.Titan}/></StyledTableCell>
                                                <StyledTableCell><ArmorType
                                                    name={ArmorTypeNames.BuildingLow}/></StyledTableCell>
                                                <StyledTableCell><ArmorType
                                                    name={ArmorTypeNames.BuildingMedium}/></StyledTableCell>
                                                <StyledTableCell><ArmorType
                                                    name={ArmorTypeNames.BuildingHigh}/></StyledTableCell>
                                                <StyledTableCell><ArmorType
                                                    name={ArmorTypeNames.BuildingSuper}/></StyledTableCell>
                                                <StyledTableCell><img style={{verticalAlign: "top"}}
                                                                      src="/images/ARM_Morale.webp"/>
                                                    <div style={{width: 20, fontSize: 12, height: 50}}>
                                                        <i>Morale</i></div>
                                                </StyledTableCell>
                                            </TableRow>
                                        </TableHead>
                                        <TableBody>
                                            <TableRow>
                                                <StyledTableCell>{getTotalDamage(vehLowPiercing)}</StyledTableCell>
                                                <StyledTableCell>{getTotalDamage(vehMedPiercing)}</StyledTableCell>
                                                <StyledTableCell>{getTotalDamage(vehHighPiercing)}</StyledTableCell>
                                                <StyledTableCell>{getTotalDamage(livingMetalPiercing)}</StyledTableCell>
                                                <StyledTableCell>{getTotalDamage(titanPiercing)}</StyledTableCell>
                                                <StyledTableCell>{getTotalDamage(buildingLowPiercing)}</StyledTableCell>
                                                <StyledTableCell>{getTotalDamage(buildingMedPiercing)}</StyledTableCell>
                                                <StyledTableCell>{getTotalDamage(buildingHighPiercing)}</StyledTableCell>
                                                <StyledTableCell>{getTotalDamage(buildingSuperPiercing)}</StyledTableCell>
                                                <StyledTableCell>{getMoraleDamage()}</StyledTableCell>
                                            </TableRow>
                                        </TableBody>
                                    </Table> :
                                    <Table sx={{marginTop: "10px"}} size="small" aria-label="a dense table">
                                        <TableHead>
                                            <TableRow>
                                                <StyledTableCell><ArmorType
                                                    name={ArmorTypeNames.InfantryLow}/></StyledTableCell>
                                                <StyledTableCell><ArmorType
                                                    name={ArmorTypeNames.InfantryMedium}/></StyledTableCell>
                                                <StyledTableCell><ArmorType
                                                    name={ArmorTypeNames.InfantryHigh}/></StyledTableCell>
                                                <StyledTableCell><ArmorType
                                                    name={ArmorTypeNames.InfantryHeavyMedium}/></StyledTableCell>
                                                <StyledTableCell><ArmorType
                                                    name={ArmorTypeNames.InfantryHeavyHigh}/></StyledTableCell>
                                                <StyledTableCell><ArmorType
                                                    name={ArmorTypeNames.Commander}/></StyledTableCell>
                                                <StyledTableCell><ArmorType
                                                    name={ArmorTypeNames.DemonMedium}/></StyledTableCell>
                                                <StyledTableCell><ArmorType
                                                    name={ArmorTypeNames.DemonHigh}/></StyledTableCell>
                                                <StyledTableCell><ArmorType name={ArmorTypeNames.Air}/></StyledTableCell>
                                                <StyledTableCell><ArmorType
                                                    name={ArmorTypeNames.VehicleLow}/></StyledTableCell>
                                                <StyledTableCell><ArmorType
                                                    name={ArmorTypeNames.VehicleMedium}/></StyledTableCell>
                                                <StyledTableCell><ArmorType
                                                    name={ArmorTypeNames.VehicleHigh}/></StyledTableCell>
                                                <StyledTableCell><ArmorType
                                                    name={ArmorTypeNames.BuildingLow}/></StyledTableCell>
                                                <StyledTableCell><ArmorType
                                                    name={ArmorTypeNames.BuildingMedium}/></StyledTableCell>
                                                <StyledTableCell><ArmorType
                                                    name={ArmorTypeNames.BuildingHigh}/></StyledTableCell>
                                                <StyledTableCell><img style={{verticalAlign: "top"}}
                                                                      src="/images/ARM_Morale.webp"/>
                                                    <div style={{width: 20, fontSize: 12, height: 50}}>
                                                        <i>Morale</i></div>
                                                </StyledTableCell>
                                            </TableRow>
                                        </TableHead>
                                        <TableBody>
                                            <TableRow>
                                                <StyledTableCell>{getTotalDamage(infLowPiercing)}</StyledTableCell>
                                                <StyledTableCell>{getTotalDamage(infMedPiercing)}</StyledTableCell>
                                                <StyledTableCell>{getTotalDamage(infHighPiercing)}</StyledTableCell>
                                                <StyledTableCell>{getTotalDamage(infHeavyMedPiercing)}</StyledTableCell>
                                                <StyledTableCell>{getTotalDamage(infHeavyHighPiercing)}</StyledTableCell>
                                                <StyledTableCell>{getTotalDamage(commanderPiercing)}</StyledTableCell>
                                                <StyledTableCell>{getTotalDamage(demonPiercing)}</StyledTableCell>
                                                <StyledTableCell>{getTotalDamage(demonHighPiercing)}</StyledTableCell>
                                                <StyledTableCell>{getTotalDamage(airPiercing, true)}</StyledTableCell>
                                                <StyledTableCell>{getTotalDamage(vehLowPiercing)}</StyledTableCell>
                                                <StyledTableCell>{getTotalDamage(vehMedPiercing)}</StyledTableCell>
                                                <StyledTableCell>{getTotalDamage(vehHighPiercing)}</StyledTableCell>
                                                <StyledTableCell>{getTotalDamage(buildingLowPiercing)}</StyledTableCell>
                                                <StyledTableCell>{getTotalDamage(buildingMedPiercing)}</StyledTableCell>
                                                <StyledTableCell>{getTotalDamage(buildingHighPiercing)}</StyledTableCell>
                                                <StyledTableCell>{getMoraleDamage()}</StyledTableCell>
                                            </TableRow>
                                        </TableBody>
                                    </Table>
                                }

                            </TableContainer>
                            <i className="rgdFrom">{weapon.filename}</i>
                        </Grid2>
                        {weapon.requirements !== null && !this.props.isDefault && this.props.haveReinforceMenu &&
                            <Grid2 size={{xs: 12, md: 12}}>
                                <Required requirement={weapon.requirements} modId={this.props.mod.id} raceId={this.props.race.id}/>
                            </Grid2>}
                        <Grid2 size={12}>
                            {renderAffectedResearches(weapon.affectedResearches, this.props.mod.id, this.props.race.id)}
                        </Grid2>
                    </Grid2>
                </AccordionDetails>
            </Accordion></div>
        );
    }
}

export default Weapon;