import React, { useContext } from 'react';
import {
    GlyphButton,
    Col,
    Container,
    Label,
    Row,
} from '@theorchard/suite-components';
import { AbacusContractLifecycleStatus } from 'src/apollo/definitions/globalTypes';
import { generalSectionStyling } from 'src/components/contract-detail/constants';
import { ContractLifecycleEditRenewal } from 'src/components/contract-lifecycle-edit/contract-lifecycle-edit-renewal';
import RestrictedByAbacusProfileWrapper from 'src/components/restricted-by-abacus-profile-wrapper';
import { CONTRACT_TYPES } from 'src/constants';
import { ContractLifecycleContext } from 'src/contexts/contract-lifecycle-context';
import {
    formatTerminationPeriod,
    RenewalDescription,
} from './contract-renewal-section-utils';

export interface ContractRenewalSectionDistroProps {
    classPrefix: string;
}

export const ContractRenewalSectionDistro: React.FC<
    ContractRenewalSectionDistroProps
> = ({ classPrefix }) => {
    const {
        contract,
        isEditingContractRenewalRules,
        setIsEditingContractRenewalRules,
    } = useContext(ContractLifecycleContext);

    const lifecycle = contract?.lifecycle;
    if (!lifecycle) return null;

    const statuses = [
        AbacusContractLifecycleStatus.TO_BE_TERMINATED,
        AbacusContractLifecycleStatus.TERMINATED,
        AbacusContractLifecycleStatus.IN_COLLECTION_PERIOD,
    ] as AbacusContractLifecycleStatus[];

    const renewalStyling = !classPrefix?.includes('editable')
        ? generalSectionStyling
        : {};

    return (
        <div className={classPrefix} style={renewalStyling}>
            <h3 className={`${classPrefix}-header-block`}>
                Current Period &amp; Renewal Rules
            </h3>
            <RestrictedByAbacusProfileWrapper>
                <GlyphButton
                    className="ContractDetail-general-details-editButton"
                    disabled={statuses.includes(lifecycle?.lifecycleStatus)}
                    onClick={() =>
                        setIsEditingContractRenewalRules(
                            !isEditingContractRenewalRules
                        )
                    }
                    variant="secondary"
                    name="edit"
                />
            </RestrictedByAbacusProfileWrapper>
            <ContractLifecycleEditRenewal
                isSidecarOpen={isEditingContractRenewalRules}
                setIsSidecarOpen={setIsEditingContractRenewalRules}
            />
            <Container>
                <Row>
                    <Col md={4}>
                        <Label text="Current Period Start Date" />
                        <div data-testid="current-period-start-date">
                            {lifecycle.lifecycleTermStart}
                        </div>
                    </Col>
                    <Col md={4}>
                        <Label text="Current Period End Date" />
                        <div data-testid="current-period-end-date">
                            {lifecycle.lifecycleTermEnd || '-'}
                        </div>
                    </Col>
                    <Col md={4}>
                        <Label text="Termination Notice Period" />
                        <div data-testid="termination-notice-period">
                            {formatTerminationPeriod(contract) || '-'}
                        </div>
                    </Col>
                </Row>
            </Container>
            <div
                className="ContractDetail-renewal-section-description"
                data-testid="renewal-section-description"
            >
                <RenewalDescription
                    contract={contract}
                    contractType={CONTRACT_TYPES.DISTRIBUTION}
                />
            </div>
        </div>
    );
};

export default ContractRenewalSectionDistro;
